﻿namespace Bildverarbeitung.CGFilter
{
    using System;
    using System.Drawing;
    using Bildverarbeitung;
    using System.Drawing.Imaging;

    public class AForgeKellerChristopher: Bildverarbeitung.IFilter
    {
        public String GetName()
        {
            return ("KellerChristopher");
        }

        //Unterschiede der Bilder bestimmen
        public Bitmap GetSummerizedDifferencefromAverage(Bitmap[] inputImages)
        {
                unsafe
                {
                   //Erzeugen des ImageArrays
                    Bitmap[] bildArray = new Bitmap[inputImages.Length + 1];
                    byte*[] bildPunkt = new byte*[inputImages.Length + 1];
                    BitmapData[] imgData = new BitmapData[inputImages.Length + 1];
                   
                    //Setze auf jedes Bild einen Pointer
                    for (int i = 0; i <= inputImages.Length; i++)
                    {
                        if (i == 0)
                        {
                            bildArray[i] = new Bitmap(inputImages[i].Width, inputImages[i].Height, PixelFormat.Format24bppRgb);
                        }
                        else
                        {
                            bildArray[i] = inputImages[i - 1];
                        }

                        imgData[i] = bildArray[i].LockBits(
                                                        new Rectangle(new Point(0, 0), bildArray[i].Size),
                                                        ImageLockMode.ReadWrite,
                                                        PixelFormat.Format24bppRgb);

                        bildPunkt[i] = (byte*)imgData[i].Scan0.ToPointer();
                    }





                    int padding = imgData[0].Stride - (bildArray[0].Width * 3);
                    int[] farbwert1, farbwert2, farbwert3;

                    for (int y = 0; y < bildArray[0].Height; y++)
                    {
                        for (int x = 0; x < bildArray[0].Width; x++)
                        {
                            farbwert1 = new int[inputImages.Length];
                            farbwert2 = new int[inputImages.Length];
                            farbwert3 = new int[inputImages.Length];
                            for (int i = 1; i < bildArray.Length; i++)
                            {
                                farbwert1[i - 1] = bildPunkt[i][2]; 
                                farbwert2[i - 1] = bildPunkt[i][1]; 
                                farbwert3[i - 1] = bildPunkt[i][0];      
                            }
                         //Für jedes Pixel wird verglichen
                            Array.Sort(farbwert1);
                            Array.Sort(farbwert2);
                            Array.Sort(farbwert3);
                            bildPunkt[0][2] = (byte)farbwert1[farbwert1.Length / 2]; // R
                            bildPunkt[0][1] = (byte)farbwert2[farbwert1.Length / 2]; // G
                            bildPunkt[0][0] = (byte)farbwert3[farbwert1.Length / 2]; // B

                       
                            for (int i = 0; i < bildArray.Length; i++)
                            {
                                bildPunkt[i] += 3;
                            }
                        }
                        for (int i = 0; i < bildArray.Length; i++)
                        {
                            bildPunkt[i] += padding;
                        }
                    }
                    for (int i = 0; i < bildArray.Length; i++)
                    {
                        bildArray[i].UnlockBits(imgData[i]);
                    }
                    return bildArray[0];
                }
            }
        }



        
    }